package demo.pattern.proxy.dynamic.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class ProxyUtils {
	/**
	 * 创建代理类
	 * @param targetObject：目标类
	 * @param handler：执行目标方法的类
	 * @param <T> 代理类实例
	 * @return
	 */
	// 方法返回值为目标类的类型，要求目标类必须声明为接口类型，如果传入的targetObject的类型不是接口，就会出错，调用方不需要强转
	public static <T> T createProxy(T targetObject, InvocationHandler handler){
		ClassLoader classLoader = targetObject.getClass().getClassLoader();
		Class<?>[] interfaces = targetObject.getClass().getInterfaces();
		return (T) Proxy.newProxyInstance(classLoader,interfaces,handler);
	}

	// 返回值为object类型，调用方需要强转
	public static Object newProxy(Object targetObject, InvocationHandler handler){
		ClassLoader classLoader = targetObject.getClass().getClassLoader();
		Class<?>[] interfaces = targetObject.getClass().getInterfaces();
		return Proxy.newProxyInstance(classLoader,interfaces,handler);
	}
}
